/**
 * created by 小卷毛, 2019-09-16 016
 * Copyright (c) 2019, 416143467@qq.com All Rights Reserved.
 * #                   *********                            #
 * #                  ************                          #
 * #                  *************                         #
 * #                 **  ***********                        #
 * #                ***  ****** *****                       #
 * #                *** *******   ****                      #
 * #               ***  ********** ****                     #
 * #              ****  *********** ****                    #
 * #            *****   ***********  *****                  #
 * #           ******   *** ********   *****                #
 * #           *****   ***   ********   ******              #
 * #          ******   ***  ***********   ******            #
 * #         ******   **** **************  ******           #
 * #        *******  ********************* *******          #
 * #        *******  ******************************         #
 * #       *******  ****** ***************** *******        #
 * #       *******  ****** ****** *********   ******        #
 * #       *******    **  ******   ******     ******        #
 * #       *******        ******    *****     *****         #
 * #        ******        *****     *****     ****          #
 * #         *****        ****      *****     ***           #
 * #          *****       ***        ***      *             #
 * #            **       ****        ****                   #
 */
package com.baidu.mapapi

import com.baidu.mapapi.map.BaiduMap
import com.baidu.mapapi.map.MapPoi
import com.baidu.mapapi.map.MapStatus
import com.baidu.mapapi.model.LatLng

fun BaiduMap.setMapStatusChangeListener(listener: MapStatusChangeListener.() -> Unit) {
    val mListener = MapStatusChangeListener()
    mListener.listener()
    setOnMapStatusChangeListener(mListener)
}

fun BaiduMap.setMapClickListene(listener: MapClickListener.() -> Unit) {
    val mListener = MapClickListener()
    mListener.listener()
    setOnMapClickListener(mListener)
}

open class MapStatusChangeListener : BaiduMap.OnMapStatusChangeListener {

    private var _onMapStatusChangeStart: ((MapStatus) -> Unit)? = null
    private var _onMapStatusChangeStartReason: ((MapStatus, Int) -> Unit)? = null
    private var _onMapStatusChange: ((MapStatus) -> Unit)? = null
    private var _onMapStatusChangeFinish: ((MapStatus) -> Unit)? = null

    fun onMapStatusChangeStart(listener: (MapStatus) -> Unit) {
        _onMapStatusChangeStart = listener
    }

    fun onMapStatusChangeStart(listener: (MapStatus, Int) -> Unit) {
        _onMapStatusChangeStartReason = listener
    }

    fun onMapStatusChange(listener: (MapStatus) -> Unit) {
        _onMapStatusChange = listener
    }

    fun onMapStatusChangeFinish(listener: (MapStatus) -> Unit) {
        _onMapStatusChangeFinish = listener
    }

    /**
     * 手势操作地图，设置地图状态等操作导致地图状态开始改变。
     *
     * @param status 地图状态改变开始时的地图状态
     */
    override fun onMapStatusChangeStart(status: MapStatus) {
        _onMapStatusChangeStart?.invoke(status)
    }

    /**
     * 手势操作地图，设置地图状态等操作导致地图状态开始改变。
     *
     * @param status 地图状态改变开始时的地图状态
     * @param reason 地图状态改变的原因
     *
     * int REASON_GESTURE = 1; 用户手势触发导致的地图状态改变,比如双击、拖拽、滑动底图
     * int REASON_API_ANIMATION = 2; SDK导致的地图状态改变, 比如点击缩放控件、指南针图标
     * int REASON_DEVELOPER_ANIMATION = 3; 开发者调用,导致的地图状态改变
     */
    override fun onMapStatusChangeStart(status: MapStatus, reason: Int) {
        _onMapStatusChangeStartReason?.invoke(status, reason)
    }

    /**
     * 地图状态变化中
     *
     * @param status 当前地图状态
     */
    override fun onMapStatusChange(status: MapStatus) {
        _onMapStatusChange?.invoke(status)
    }

    /**
     * 地图状态改变结束
     *
     * @param status 地图状态改变结束后的地图状态
     */
    override fun onMapStatusChangeFinish(status: MapStatus) {
        _onMapStatusChangeFinish?.invoke(status)
    }

}

open class MapClickListener : BaiduMap.OnMapClickListener {

    private var _onMapClick: ((LatLng) -> Unit)? = null
    private var _onMapPoiClick: ((MapPoi) -> Boolean)? = null

    fun onMapClick(listener: (LatLng) -> Unit) {
        _onMapClick = listener
    }

    fun onMapPoiClick(listener: (MapPoi) -> Boolean) {
        _onMapPoiClick = listener
    }

    /**
     * 地图单击事件回调函数
     *
     * @param point 点击的地理坐标
     */
    override fun onMapClick(point: LatLng) {
        _onMapClick?.invoke(point)
    }

    /**
     * 地图内 Poi 单击事件回调函数
     *
     * @param mapPoi 点击的 poi 信息
     */
    override fun onMapPoiClick(mapPoi: MapPoi): Boolean {
        return _onMapPoiClick?.invoke(mapPoi) ?: false
    }

}
